package org.epsi.blokus.entity.dialog;

import de.matthiasmann.twl.Button;
import de.matthiasmann.twl.Color;
import de.matthiasmann.twl.EditField;
import de.matthiasmann.twl.Label;
import de.matthiasmann.twl.PopupWindow;
import de.matthiasmann.twl.ResizableFrame;
import de.matthiasmann.twl.SimpleDialog;
import de.matthiasmann.twl.TextArea;
import de.matthiasmann.twl.Widget;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import org.epsi.blokus.Hex;
import org.epsi.blokus.TWL_Slick_Binding.RootPane;
import org.epsi.blokus.TWL_Slick_Binding.TWLStateBasedGame;
import org.epsi.blokus.entity.IEntity;
import org.epsi.blokus.entity.PlayerAvatar;
import org.epsi.blokus.joueur.Client;
import org.epsi.blokus.joueur.Player;
import org.epsi.blokus.tools.I18n;
import org.epsi.blokus.tools.IConstantes;
import org.epsi.blokus.tools.Log;
import org.epsi.blokus.tools.PositionnementUtil;
import org.epsi.blokus.widget.EditFieldEnhance;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.StateBasedGame;

/**
 * Affiche la fenêtre d'identification
 * @author julien.lafont
 */
public class LoginDialog extends ResizableFrame implements IEntity, IConstantes {

    // Position de la fenêtre par défaut
    private static final int POSITION_X = 205;
    private static final int POSITION_Y = 145;

    // Accès aux infos du State en cours
    GameContainer container;
    TWLStateBasedGame game;

    // Composants
    private Button btnLeft;
    private Button btnRight;
    private Button btnValider;
    private PlayerAvatar avatar;
    private EditFieldEnhance editPseudo;
    private Label lblTitre;

    // Fenêtres et entitées enfants
    private ErrorDialog errorDialog;
    private ArrayList<IEntity> entities = new ArrayList<IEntity>();

    
    public LoginDialog() {

        Log.out("LoginDialog : Constructer");
        
        this.setTheme("dialogLogin");
        this.setTitle(I18n.get("identification"));
        this.setResizableAxis(ResizableAxis.NONE);

        btnLeft = new Button();
        btnLeft.setTheme("buttonSquareLeft");
        btnLeft.addCallback(callbackBtnPrevious);

        btnRight = new Button();
        btnRight.setTheme("buttonSquareRight");
        btnRight.addCallback(callbackBtnNext);

        editPseudo = new EditFieldEnhance();
        editPseudo.setTheme("editPseudo");
        editPseudo.setDefaultText(I18n.get("pseudo"));
        editPseudo.addCallback(callbackEditPseudo);
      
        btnValider = new Button("Valider");
        btnValider.setTheme("button");
        btnValider.addCallback(callbackBtnValider);

        lblTitre = new Label(I18n.get("selectionnerJoueur"));
        
        avatar = new PlayerAvatar();
        avatar.setPosition(260, 183);
        
        this.add(btnRight);
        this.add(btnLeft);
        this.add(editPseudo);
        this.add(btnValider);
        this.add(lblTitre);

        entities.add(avatar);
    }


      
    /**
     * Réajustement de la fenêtre demandée
     */
    public void updateRequested()
    {
        this.adjustSize();
        this.setPosition(POSITION_X, POSITION_Y);

        btnLeft.adjustSize();
        btnLeft.setPosition(POSITION_X+170, POSITION_Y+210);

        btnRight.adjustSize();
        btnRight.setPosition(POSITION_X+410, POSITION_Y+210);

        editPseudo.setSize(230, 50);
        editPseudo.setPosition(PositionnementUtil.centrer(editPseudo, this), POSITION_Y+353);

        btnValider.adjustSize();
        btnValider.setPosition(PositionnementUtil.centrer(btnValider, this), POSITION_Y+420);

        lblTitre.adjustSize();
        lblTitre.setPosition(PositionnementUtil.centrer(lblTitre, this), POSITION_X+60);

        if (errorDialog!=null) errorDialog.updateRequested();
    }

    
    public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException
    {
        // On ne rend le contenu de la fenêtre que si elle est visible et active
        if (this.isVisible() && this.isEnabled())
        {
            for (IEntity entity : entities) {
                entity.render(container, game, g);
            }
        }
    }

     public void update(GameContainer container, StateBasedGame game, int delta) throws SlickException {
       for (IEntity entity : entities) {
            entity.update(container, game, delta);
        }

       // La position de l'avatar suit celle de la fenêtre
       avatar.setPosition(this.getX()+260, this.getY()+168);
    }

    public void init(GameContainer container, StateBasedGame game) throws SlickException {

        Log.out("LoginDialog : Init");

        this.container = container;
        this.game = (TWLStateBasedGame)game;
        
        for (IEntity entity : entities) {
            entity.init(container, game);
        }
    }


    // ---------------------------- Contrôles ---------------------------- //

    /**
     * Action appelée lors de la validation du formulaire d'identification
     * Si tout est OK on passe au state MENU
     * Sinon on affiche une erreur en Popup
     */
   public void valider()
   {
       if (checkValidity()) {

           Log.out("LoginDialog : Validation réussie");

           // Enregistre les informations
           Client moi = (Client)Hex.getInstance().getPlayer();
           moi.isReady(this.editPseudo.getText(), this.avatar.getSelectedAvatar());

           this.game.enterState(ID_STATE_ATTENTE);
       }
       else
       {
          // Met en arrière plan la fenêtre d'identification
          this.goToBackground();

          // Affiche la fenêtre d'erreur
          this.errorDialog = new ErrorDialog(I18n.get("Erreur"), I18n.get("Erreur_Login"));
          
          // Définit l'évènement au onClose : Réafficher la fenêtre
          this.errorDialog.setCloseCallback(new Runnable() {
                public void run() {
                    goToForeground();
                }
          });

          this.game.getRootPane().add(errorDialog);
          
       }

   }

   /**
    * Vérifie que la saisie du formulaire est valide
    * @return
    */
    public Boolean checkValidity()
    {
        return this.editPseudo.getText().length()>0 && !this.editPseudo.isDefaultText();
    }

    /**
     * Met la fenêtre en second plan
     */
    public void goToBackground()
    {
        this.setEnabled(false);
        this.fadeTo(new Color(0x66FFFFFF), 1000);
    }

    /**
     * Met la fenêtre au premier plan
     */
    public void goToForeground()
    {
        this.setEnabled(true);
        this.fadeTo(new Color(0xFFFFFFFF), 1000);
    }


    // ------------------------ Callback -------------------------------- //
    
    Runnable callbackBtnValider = new Runnable() {
        public void run() {
            valider();
        }
    };
    Runnable callbackBtnNext = new Runnable() {
        public void run() {
            avatar.avatarNext();
        }
    };
    Runnable callbackBtnPrevious = new Runnable() {
        public void run() {
            avatar.avatarPrevious();
        }
    };
    EditField.Callback callbackEditPseudo = new EditField.Callback() {
        public void callback(int key) {
            if (key==28) { valider(); } 
        }
    };







}
